#include <iostream>


//指针基础
void Test01(){
    int a = 8;

	//将a的地址赋给ptr,ptr也是一个变量
	int* ptr = &a;
	std::cout << "指针变量ptr的值是:" << ptr << std::endl;
	std::cout << "指针变量ptr所指向的内存区域的值是:" << *ptr << std::endl;
}

//通过指针修改值
void Test02(){
    int a = 8;
    std::cout << "a的值是:" << a << std::endl;

	int* ptr = &a;
	//拿到a的地址所指向的内存，并将内存中的值改成10
	*ptr = 10;

    std::cout << "a的值是:" << a << std::endl;
}

//指针可以先声明，再赋值
void Test03(){
    int a = 8;
    int *ptr;

    ptr = &a;
}

//初始化空指针，就像int i=0;一样
void Test04(){
    int *ptr = NULL;

    //再赋值
    int a = 8;
    ptr = &a;
}

//指针可以改变指向
void Test05(){
    int a = 8;
    int *ptr = &a;

    int b = 10;
    ptr = &b;
    *ptr = 20;

    std::cout << "a的值是:" << a << std::endl;
    std::cout << "b的值是:" << b << std::endl;
}

//指针就是门牌号，就是一个整数，和所指的内存区域大小没有关系
void Test06(){
    std::cout << "int指针的大小：" << sizeof(int*) << std::endl;
    std::cout << "char指针的大小：" << sizeof(char*) << std::endl;
    std::cout << "long long指针的大小：" << sizeof(long long*) << std::endl;
    std::cout << "bool指针的大小：" << sizeof(bool*) << std::endl;
    std::cout << "float指针的大小：" << sizeof(float*) << std::endl;
    std::cout << "double指针的大小：" << sizeof(double*) << std::endl;
}

//二级指针概念
//指针是变量，变量就有地址，所以指针变量也有自己的地址
void Test07(){
    int a = 8;
    int* ptr = &a;

    //ptr是门牌号，怎么找到你家的门牌号呢？就要通过你的小区，ptr2就是小区
    int** ptr2 = &ptr;

    **ptr2 = 10; //通过二级指针修改一级指针所指向的内存区域的值

    std::cout << "a的值是:" << a << std::endl;
}

//我是直接通过地址来修改值的，所以在函数外面也能知道修改了
void swap(int* a, int* b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

/**
 * 指针作为函数参数
 */
void Test08(){
    int a = 8, b = 10;
    swap(&a, &b);
    std::cout << "a的值是:" << a << std::endl;
    std::cout << "b的值是:" << b << std::endl;
}

//函数里面是修改了，但是外面看不到（因为其实是复制了一份参数）
void swap2(int a, int b){
    int temp = a;
    a = b;
    b = temp;
}

void Test09(){
    int a = 8, b = 10;
    swap2(a, b);
    std::cout << "a的值是:" << a << std::endl;
    std::cout << "b的值是:" << b << std::endl;
}

/**
 * 指针测试
 */
int main(){
    // Test01();

    // Test03();

    // Test04();

    // Test05();

    // Test06();

    // Test07();

    // Test08();

    return 0;
}